package com.asambleacristiana.bean;

import static spark.Spark.get;
import static spark.Spark.post;
import static spark.Spark.before;
import static spark.Spark.options;
import static spark.Spark.halt;
import static spark.SparkBase.staticFileLocation;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import spark.ModelAndView;
import spark.Spark;
import spark.template.freemarker.FreeMarkerEngine;

import com.asambleacristiana.domain.JsonTransformer;
import com.asambleacristiana.domain.Miembro;
import com.asambleacristiana.repository.dao.DAOFactoryJPA;

import freemarker.template.Configuration;

public class MainApp {

	public static void main(String[] args) {


		staticFileLocation("/public");
		Configuration configuration = new Configuration();
		configuration.setClassForTemplateLoading(MainApp.class, "/");

//http://www.mastertheboss.com/cool-stuff/create-a-rest-services-layer-with-spark
		before((request, response) -> {
			String method = request.requestMethod();
			if (method.equals("POST") || method.equals("PUT")
					|| method.equals("DELETE")) {
				String authentication = request.headers("Authentication");
				if (!"PASSWORD".equals(authentication)) {
					halt(401, "User Unauthorized");
				}
			}
		});
		
		options("/*", (request,response)->{
			 
		    String accessControlRequestHeaders = request.headers("Access-Control-Request-Headers");
		    if (accessControlRequestHeaders != null) {
		        response.header("Access-Control-Allow-Headers", accessControlRequestHeaders);
		    }
		 
		    String accessControlRequestMethod = request.headers("Access-Control-Request-Method");
		    if(accessControlRequestMethod != null){
		    response.header("Access-Control-Allow-Methods", accessControlRequestMethod);
		    }
		 
		    return "OK";
		});
		 
		Spark.before((request,response)->{
		    response.header("Access-Control-Allow-Origin", "*");
		});
		
		
		get("/asistencias", (request, response) -> {

			List<Miembro> miembros = new ArrayList<Miembro>();
			miembros = DAOFactoryJPA.getInstance().getMiembroDAO().findAll();

			Map<String, Object> attributes = new HashMap<>();

			attributes.put("miembros", miembros);

			return new ModelAndView(attributes, "asistencias.ftl");

		}, new FreeMarkerEngine());

		post("/confirmarAsistencias", (request, response) -> {
			String title = request.queryParams("article-title");
			String summary = request.queryParams("article-summary");
			String content = request.queryParams("article-content");
			response.status(201);
			response.redirect("/asitencias");
			return "";
		});

		// JSON

		get("/miembros", "application/json", (request, response) -> {
			List<Miembro> miembros = new ArrayList<Miembro>();
			miembros = DAOFactoryJPA.getInstance().getMiembroDAO().findAll();
			return miembros;
		}, new JsonTransformer());

		get("/miembro/:id", "application/json",
				(request, response) -> {
					String error = null;
					try {
						Integer id = Integer.parseInt(request.params(":id"));
						Miembro miembro = new Miembro();
						miembro = DAOFactoryJPA.getInstance().getMiembroDAO()
								.findById(id);
						return miembro;
					} catch (Exception e) {
						error = e.getMessage();
					}
					return error;

				}, new JsonTransformer());
	}

}
